#pragma once
#include "TcpServer.hpp"
#include <memory>
#include <unordered_map>

const std::string gspace = " ";
const std::string newline = "\r\n";
const std::string gesp = ": ";
// 接受请求的处理
class HttpRequest
{
public:
    HttpRequest()
    {
    }
    // 序列化(不用实现,因为不会享客户端发送请求)
    std::string Serialize()
    {
        return nullptr;
    }
    // 反序列化
    bool DeSerialize(const std::string &reqstr)
    {
        return true;
    }
    ~HttpRequest()
    {
    }

private:
    std::string req_method; // 请求方法
    std::string _uri;       // uri(文件路径)
    std::string _version;   // HTTP版本

    std::unordered_map<std::string, std::string> _headers; // 请求报头
    std::string _blackline;                                // 空行
    std::string _text;                                     // 正文
};

// 应答处理
class HttpResponse
{
public:
    HttpResponse():_blankline(newline)
    {
    }
    // 序列化(实现)
    std::string Serialize()
    {
        std::string result;
        //状态行信息
        result = _version + gspace + std::to_string(_code) + gspace + _desc + newline;
        //响应报头
        for(auto& head:_headers)
        {
            result += head.first + gesp +head.second + gspace;
        }
        //空行
        result += _blankline;
        //正文
        result += _text;
        return result;
    }
    // 反序列化
    bool ReSerialize()
    {
    }
    ~HttpResponse()
    {
    }

public:
    std::string _version; // HTTP版本
    int _code;            // 状态码
    std::string _desc;    // 状态码描述

    std::unordered_map<std::string, std::string> _headers; // 响应报头
    std::string _blankline;                                 // 空行
    std::string _text;                                     // 正文
};
// http协议
class Http
{
public:
    // 构造函数(HTTP底层基于tcp)
    Http(uint16_t port) : tsvrp(std::make_unique<TcpServer>(port))
    {
    }
    // http协议的接收和返回
    void HandlHttpResquest(std::shared_ptr<Socket> &sock, Inet_Addr addr)
    {
#ifndef DEBUG
#define DEBUG
        // 读取请求
        std::string message; // 获取读到的字符串
        sock->Recv(&message);
        std::cout << message;//输出读到的字符串
        HttpResponse req;
        req._version = "HTTP 1.1";
        req._code = 200;
        req._desc = "OK";
        req._text = "<!DOCTYPE html>\
                    <html>\
                        <body>\
                            <h1> Hello,World !</ h1>\
                            <h1> Hello,World !</ h1>\
                            <h1> Hello,World !</ h1>\
                            <h1> Hello,ylz !</ h1>\
                            <h1> Hello,World !</ h1>\
                        </body> \
                    </html>";
        std::string result = req.Serialize();
        sock->Send(result);
#endif
    }
    // 服务器的入口
    void Start()
    {
        // 将Http协议的方法绑定给TcpServer,
        // 使得与客户端建立好链接后直接进入Http服务模块进行对应的请求处理
        tsvrp->Start([this](std::shared_ptr<Socket> &sock, Inet_Addr addr)
                     { this->HandlHttpResquest(sock, addr); });
    }
    ~Http()
    {
    }

private:
    std::unique_ptr<TcpServer> tsvrp;
};